#include "Agenda.h"


    /* *********************************************************************
        Classe: Agenda
        Funcionalidade: A Agenda tem como função guardar datas de atendimentos
    a serem realizados pelos pacientes, fazendo o CRUD dos eventos.
    ***********************************************************************/


Agenda::Agenda(){
    numItens=0;
}

/* Insere um evento no final da lista */
bool Agenda::inserirEvento(string d, string nPac, int di, int m, int a, int h,
		int mi, list<Cliente> clientes, Vacina * vacina) {
	Paciente * pac = Pesquisa::buscarPaciente(nPac, clientes);
	ItemAgenda temp(d, pac, di, m, a, h, mi, vacina);
	itensAgenda.push_back(temp);
	numItens++;
	return true;
}

bool Agenda::inserirEvento(string d, string nPac, string nVac, int di, int m, int a, int h,
		int mi, list<Cliente> clientes, list<Vacina> vacinas) {
	Paciente * pac = Pesquisa::buscarPaciente(nPac, clientes);
	Vacina * vac = Pesquisa::buscarVacina(nVac, vacinas);
	ItemAgenda temp(d, pac, di, m, a, h, mi, vac);
	itensAgenda.push_back(temp);
	numItens++;
	return true;
}

ItemAgenda * Agenda::buscarEvento(string d) {
	return Pesquisa::buscarEventoAgenda(d, itensAgenda);
}

bool Agenda::atendimentoRealizado(string d) {
	ItemAgenda * temp = buscarEvento(d);
	if (temp == NULL)
		return false;
	//Aqui ele pega o paciente que tá no itemAgenda, pega a carteira do
	//paciente e adiciona informações sobre a vacina tomada
	temp->getPaciente()->getCarteira().atualizarCarteira(temp->getVacina(),
			temp->getDataAtendimento());
    temp->getVacina()->removeFrasco();
	return true;
}


/* Busca um evento pela sua descricao e modifica ele*/
bool Agenda::modificaEventoDAt(string d, int di, int m, int a, int h, int mi) {
	ItemAgenda * temp = buscarEvento(d);
	if (temp == NULL)
		return false;
	temp->setDataAtendimento(di, m, a, h, mi);
	itensAgenda.push_back(*temp);
	return true;
}

bool Agenda::modificaEventoDAg(string d, int di, int m, int a, int h, int mi) {
	ItemAgenda * temp = buscarEvento(d);
	if (temp == NULL)
		return false;
	temp->setDataAgendamento(di, m, a, h, mi);
	itensAgenda.push_back(*temp);
	return true;
}

bool Agenda::modificaEventoDesc(string d, string nd) {
	ItemAgenda * temp = buscarEvento(d);
	if (temp == NULL)
		return false;
	temp->setDescricao(nd);
	itensAgenda.push_back(*temp);
	return true;
}

list<ItemAgenda> &Agenda::getItensAgenda(){
    return itensAgenda;
}

bool Agenda::modificaEventoVac(string d, Vacina * vacina) {
	ItemAgenda * temp = buscarEvento(d);
	if (temp == NULL)
		return false;
	temp->setVacina(vacina);
	itensAgenda.push_back(*temp);
	return true;
}

/* Remove um evento; retorna 0 caso o mesmo nao exista */
bool Agenda::removerEvento(string d) {
	list<ItemAgenda>::iterator it;
	for (it = itensAgenda.begin(); it != itensAgenda.end(); it++) {
		if (d == it->getDescricao()) {

			itensAgenda.erase(it);
			numItens--;
			return true;
		}
	}
	return false;
}

/* Remove todos os eventos da agenda */
void Agenda::limparAgenda() {
	itensAgenda.clear();
}

